import { CartItem } from '@/types/cart'
import { IResponse } from '@/types/data'
import request from '@/utils/request'
import { AxiosResponse } from 'axios'
import { defineStore } from 'pinia'
import useStore from '..'

const useCartStore = defineStore('cart', {
  persist: true,
  state() {
    return {
      list: [] as CartItem[],
    }
  },
  actions: {
    // 加入购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        const { skuId, count } = data
        await request.post('/member/cart', { skuId, count })
        this.getCartList()
      } else {
        // 如果 skuId 曾经在 this.list 中，就让数量加上传递过来的数量
        const goods = this.list.find((sku) => sku.skuId === data.skuId)
        if (goods) {
          goods.count += data.count
        } else {
          // 没有存在，直接装进数组
          this.list.unshift(data)
        }
      }
    },
    // 获取购物车
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<IResponse<CartItem[]>>('/member/cart')
        this.list = res.data.result
      } else {
        // 遍历发送请求, 校验更新sku商品的库存和价格, 是否有效
        /* this.list.forEach(async (cartItem) => {
          const { skuId } = cartItem
          // 根据 skuId 获取最新商品信息
          const res = await request.get<IResponse<CartItem>>(`/goods/stock/${skuId}`)
          // 保存最新商品信息
          const lastCartInfo = res.data.result
          // 更新商品现价
          cartItem.nowPrice = lastCartInfo.nowPrice
          // 更新商品库存
          cartItem.stock = lastCartInfo.stock
          // 更新商品是否有效
          cartItem.isEffective = lastCartInfo.isEffective
        }) */

        const promiseArr: Promise<AxiosResponse<IResponse<CartItem>, any>>[] = []
        // const promiseArr: any[] = []
        this.list.forEach(async (cartItem) => {
          const { skuId } = cartItem
          promiseArr.push(request.get<IResponse<CartItem>>(`/goods/stock/${skuId}`))
        })
        Promise.all(promiseArr).then((r) => {
          // [第一个请求的结果，第二个请求的结果，...]
          this.list.forEach((cartItem, index) => {
            cartItem.nowPrice = r[index].data.result.nowPrice
            // 更新商品库存
            cartItem.stock = r[index].data.result.stock
            // 更新商品是否有效
            cartItem.isEffective = r[index].data.result.isEffective
          })
        })
      }
    },
    // 删除购物车，注意传递参数的格式 [skuId]
    async deleteCart(skuIds: string[]) {
      if (this.isLogin) {
        // 传参
        // 路径传参 /list/888
        // url 参数传参，会通过 ？号进行拼接，axios 通过 params 进行
        // 请求体传参，POST、PUT、PATCH，axios 通过 data
        await request.delete('/member/cart', {
          data: { ids: skuIds },
        })
        this.getCartList()
      } else {
        // skuIds => [888, 777]
        this.list = this.list.filter((item) => !skuIds.includes(item.skuId))
      }
    },
    // 更新购物车选中状态和数量
    async updateCart(skuId: string, data: { selected?: boolean; count?: number }) {
      if (this.isLogin) {
        await request.put(`/member/cart/${skuId}`, data)
        // 重新获取最新购物车列表
        this.getCartList()
      } else {
        const goods = this.list.find((sku) => sku.skuId === skuId)
        if (data.selected !== undefined) {
          // 此时传递的是 selected，所以要修改 selected
          goods!.selected = data.selected
        }
        if (data.count !== undefined) {
          goods!.count = data.count
        }
      }
    },
    // 全选/全不选，修改选中状态
    async updateCartAllSelected(isSelected: boolean) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', {
          selected: isSelected,
        })
        // 获取购物车列表
        this.getCartList()
      } else {
        this.list.forEach((item) => (item.selected = isSelected))
      }
    },
    // 清空购物车
    clearCart() {
      this.list = []
    },
    async mergeLocalCart() {
      const data = this.list.map(({ skuId, selected, count }) => ({
        skuId,
        selected,
        count,
      }))
      await request.post('/member/cart/merge', data)
      // 合并成功，重新获取购物车列表
      this.getCartList()
    },
  },
  getters: {
    /* effectiveList(): CartItem[] {
      // isEffective 是 true 并且库存大于 0 才是有效
      return this.list.filter((goods) => goods.isEffective && goods.stock > 0)
    }, */
    // 有效商品列表
    effectiveList(state) {
      // state => this
      // isEffective 是 true 并且库存大于 0 才是有效
      return state.list.filter((goods) => goods.isEffective && goods.stock > 0)
    },
    // 有效商品总数量 = 有效商品的每一项的 count 相加
    effectiveListCounts(): number {
      return this.effectiveList.reduce((acc, cur) => acc + cur.count, 0)
    },
    // 总钱数 = 有效商品的每一项的单价 * 有效商品的每一项的 count，然后相加
    effectiveListPrice(): number {
      return this.effectiveList.reduce((acc, cur) => acc + +cur.nowPrice * cur.count, 0)
    },
    // 全选状态
    isAllSelected(): boolean {
      return this.effectiveList.length !== 0 && this.effectiveList.every((item) => item.selected)
    },
    // 已选择的列表 = 从有效的列表里面找 selected 为 true
    selectedList(): CartItem[] {
      return this.effectiveList.filter((item) => item.selected)
    },
    // 已选择的商品总数 = 已选择的列表的每一项的 count 相加
    selectedListCounts(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选择的列表总价 = 已选择的列表的每一项的 count * 每一项的单价 相加
    selectedListPrice(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
    },
    isLogin(): boolean {
      const { user } = useStore()
      return !!user.profile.token
    },
  },
})

export default useCartStore
